package ghostcat.algorithm.traversal
{

    public class BinaryHeap extends Object
    {
        public var sortMetord:Function;
        private var data:Array;

        public function BinaryHeap()
        {
            sortMetord = defaultSortMetord;
            clear();
            return;
        }// end function

        public function push(param1) : void
        {
            var _loc_2:* = data.push(param1) - 1;
            modifyIndex(_loc_2);
            return;
        }// end function

        public function get length() : int
        {
            return (data.length - 1);
        }// end function

        private function modifyIndex(param1:int) : void
        {
            var _loc_3:int = 0;
            var _loc_4:* = undefined;
            var _loc_2:* = param1;
            while (_loc_2 > 1)
            {
                
                _loc_3 = int(_loc_2 / 2);
                if (sortMetord(data[_loc_2], data[_loc_3]))
                {
                    _loc_4 = data[_loc_2];
                    data[_loc_2] = data[_loc_3];
                    data[_loc_3] = _loc_4;
                }
                else
                {
                    break;
                }
                _loc_2 = _loc_3;
            }
            return;
        }// end function

        public function modify(param1) : void
        {
            var _loc_2:* = data.indexOf(param1);
            if (_loc_2 > 0)
            {
                modifyIndex(_loc_2);
            }
            return;
        }// end function

        public function clear() : void
        {
            data = [null];
            return;
        }// end function

        public function shift()
        {
            var _loc_3:int = 0;
            var _loc_4:int = 0;
            var _loc_5:* = undefined;
            if (data.length == 1)
            {
                return null;
            }
            if (data.length == 2)
            {
                return data.pop();
            }
            var _loc_1:* = data[1];
            var _loc_2:int = 1;
            data[1] = data.pop();
            while (true)
            {
                
                _loc_3 = _loc_2;
                _loc_4 = _loc_2 * 2;
                if (_loc_4 < data.length)
                {
                    if (sortMetord(data[_loc_4], data[_loc_2]))
                    {
                        _loc_2 = _loc_4;
                    }
                    if ((_loc_4 + 1) < data.length && sortMetord(data[(_loc_4 + 1)], data[_loc_2]))
                    {
                        _loc_2 = _loc_4 + 1;
                    }
                }
                if (_loc_2 != _loc_3)
                {
                    _loc_5 = data[_loc_2];
                    data[_loc_2] = data[_loc_3];
                    data[_loc_3] = _loc_5;
                    continue;
                }
                break;
            }
            return _loc_1;
        }// end function

        public static function defaultSortMetord(param1, param2) : Boolean
        {
            return param1 < param2;
        }// end function

    }
}
